ソフトウェア向けにキャッシュを提供してくれるSaaSの「momento」を試してみた
はじめに
おはようございます、加藤です。 momentoというキャッシュ機能を提供してくれるSaaSをトライアルさせて頂く機会があったので使い方や使用感をまとめてみます。
momentoについて
前述のとおり、momentoはキャッシュ機能を提供してくれるSaaSで下記の言語をサポートしています。
- .NET: https://github.com/momentohq/client-sdk-examples/tree/main/dotnet
- Go(Experimental): https://github.com/momentohq/client-sdk-examples/tree/main/golang
- Java: https://github.com/momentohq/client-sdk-examples/tree/main/java
- JavaScript/TypeScript: https://github.com/momentohq/client-sdk-examples/tree/main/javascript
- Python: https://github.com/momentohq/client-sdk-examples/tree/main/python
- CLI(MacOS/Linux): https://github.com/momentohq/momento-cli
CLIで試す
まずはCLIで試してみましょう。
インストールから初期設定まで行います。
brew tap momentohq/tap brew install momento-cli momento configure # Token: << トークンを入力します。 # Default Cache: example-cache << デフォルトで使用するキャッシュサーバーを指定します。 # Default Ttl Seconds [600]: 60 << レコードのデフォルトTTLを設定します。検証なので、短い方が色々便利かと思い60秒にしました。 [2022-03-16T09:09:16Z INFO momento::commands::cache::cache_cli] creating cache... [2022-03-16T09:09:17Z INFO momento::commands::configure::configure_cli] default cache successfully created
ヘルプを見てみます。
momento --help momento 0.11.8 CLI for Momento APIs USAGE: momento [OPTIONS] <SUBCOMMAND> OPTIONS: -h, --help Print help information -V, --version Print version information --verbose SUBCOMMANDS: account Manage Accounts cache Cache Operations configure Configure Momento Credentials help Print this message or the help of the given subcommand(s)
cacheサブコマンドのヘルプを見てみます。
キャッシュサーバーに対するコマンドとレコードに対するコマンドが混在しています。キャッシュサーバーおよびレコードという用語はmomento公式のモノではなく私が便宜上使っている用語なのでご注意ください。
- キャッシュサーバー
- create
- list
- レコード
- get
- set
- delete
各コマンドの使い方はmomento cache $SUBCOMMAND --help
を実行すると見ることができます。
momento cache --help momento-cache Cache Operations USAGE: momento cache [OPTIONS] <SUBCOMMAND> OPTIONS: -h, --help Print help information --verbose SUBCOMMANDS: create Creates a Momento Cache delete Deletes the cache get Gets item from the cache help Print this message or the help of the given subcommand(s) list Lists all momento caches set Stores a given item in cache
set/get操作を行ってみましょう。また、TTL経過でキャッシュが消えることを確認します。
momento cache set --key test --value value # [2022-03-16T09:28:15Z INFO momento::commands::cache::cache_cli] setting key: test into cache: example-cache # [2022-03-16T09:28:16Z INFO momento::commands::cache::cache_cli] set success momento cache get --key test # [2022-03-16T09:28:30Z INFO momento::commands::cache::cache_cli] getting key: test from cache: example-cache # value # 60秒待つ momento cache get --key test # [2022-03-16T09:30:03Z INFO momento::commands::cache::cache_cli] getting key: test from cache: example-cache # [2022-03-16T09:30:04Z INFO momento::commands::cache::cache_cli] cache miss
Lambda上で試す
こんな感じのLambda関数を東京リージョン書いて、momentoの東京リージョンに対してset/getの速度を測定してみます。
import 'source-map-support/register'; import {SimpleCacheClient} from '@momento/sdk'; import {performance} from 'perf_hooks'; const MOMENTO_AUTH_TOKEN = process.env.MOMENTO_AUTH_TOKEN!; const CACHE_NAME = process.env.MOMENTO_CACHE_NAME ?? 'stress-test'; const DEFAULT_TTL = 600; const client = new SimpleCacheClient(MOMENTO_AUTH_TOKEN, 60); const write = async (key: string, value: string): Promise<number> => { const startTime = performance.now(); await client.set(CACHE_NAME, key, value); const endTime = performance.now(); return endTime - startTime; }; const read = async (key: string): Promise<number> => { const startTime = performance.now(); await client.get(CACHE_NAME, key); const endTime = performance.now(); return endTime - startTime; }; export async function handler() { await client.createCache(CACHE_NAME); console.log( `${await write('my-key', 'my-value')}ms write, ${await read( 'my-key' )}ms read` ); await client.deleteCache(CACHE_NAME); }
1回目の書き込みだけが極端に遅かったですが(コールドスタート?)3〜6[ms]でset/getができました。
回数 | write[ms] | read[ms] |
---|---|---|
1 | 25.351194000104442 | 5.297620000084862 |
2 | 4.601006999844685 | 3.717852999921888 |
3 | 4.222333000041544 | 4.09969100006856 |
4 | 5.148039999883622 | 3.6392359999008477 |
5 | 4.5207320000045 | 3.82848499994725 |
あとがき
ゼロコンフィグで簡単に数ms単位でレスポンスができるキャッシュ機能が利用できるので、使いどころが色々とありそうです。AWSだとCloudFront FunctionsやLambda@Edgeでデータを共有したいときに使えそうだなと思いました。 また、最近はSaaSで特定のイベントをトリガーに任意のスクリプトを実行できるモノもあるので、そういったシチュエーションでデータの共有のために活用することもできそうですね。
以上でした。